package modelo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.ListIterator;

/**
 *
 * @author Yan Carlos Marín Osorio <yanCarlosmarínosorio@gmail.com>
 */
public class Restaurante {

    private Cliente[][] clientes;
    private LinkedList<Alimento> menu;

    public Restaurante() {
        clientes = new Cliente[15][4];
        menu = new LinkedList<Alimento>();
    }//Constructor de la clase

    public Cliente[][] getClientes() {
        return clientes;
    }//posicion de los clientes

    public LinkedList<Alimento> getMenu() {
        return menu;
    }//Menu de alimentos

    /**
     * Registra un alimento en el menu del restaurante
     *
     * @param alimento; el alimento que se quiere registrar
     * @return un mensaje anunciando si se registro o no el alimento
     */
    public String registrarNuevoProducto(Alimento alimento) {
        Alimento encontrado = buscarAlimento(alimento.getNombre());
        if (encontrado == null) {
            menu.add(alimento);
            return "El producto " + alimento.getNombre() + " ha sido registrado";
        } else {
            return "Ya se encuentra registrado el producto " + alimento.getNombre() + " en el menu";
        }
    }

    /**
     * Metodo que busca un alimento en el menu del restaurante
     *
     * @param nombre del alimento que se quiere buscar
     * @return el alimento si esta, de lo contrario null.
     */
    public Alimento buscarAlimento(String nombre) {
        ListIterator<Alimento> iterador = menu.listIterator();
        while (iterador.hasNext()) {
            Alimento a = iterador.next();
            if (a.getNombre().equalsIgnoreCase(nombre)) {
                return a;
            }
        }
        return null;
    }

    public void registrarCliente(int[] posicion) {
    }

    /**
     * calcula la cuenta de una mesa
     *
     * @param m numero de la mesa
     * @return la cuentaTotal de la mesa
     */
    public double calcularCuentaMesa(int m) {
        double cuentaTotal = 0;
        for (int i = 0; i < clientes[0].length; i++) {
            if (clientes[m][i] != null) {
                cuentaTotal += clientes[m][i].calcularCuenta();
            }
        }
        return cuentaTotal;
    }

    /**
     * Genera un archivo con las comidas de tipo entrada
     *
     * @param archivo nombre del archivo
     * @throws FileNotFoundException
     */
    public void generarArchivoEntrada(File archivo) throws FileNotFoundException {
        PrintWriter escritor = new PrintWriter(archivo);
        ListIterator<Alimento> iterador = menu.listIterator();
        escritor.println("Entradas:");
        escritor.println("_______________________");
        while (iterador.hasNext()) {
            Alimento a = iterador.next();
            if (a instanceof Comida) {
                Comida c = (Comida) a;
                if (c.getTipo().equals(Comida.TIPO_ENTRADA)) {
                    escritor.println("Nombre: " + a.getNombre());
                    escritor.println("Precio: " + a.getPrecio());
                    escritor.println("___________________________");

                }
            }

        }
        escritor.close();
    }

    /**
     * genera un archivo con comidas de tipo Postre
     *
     * @param archivo, nombre del archivo
     * @throws FileNotFoundException
     */
    public void generarArchivoPostre(File archivo) throws FileNotFoundException {
        PrintWriter escritor = new PrintWriter(archivo);
        ListIterator<Alimento> iterador = menu.listIterator();
        escritor.println("Postres:");
        escritor.println("_______________________");
        while (iterador.hasNext()) {
            Alimento a = iterador.next();
            if (a instanceof Comida) {
                Comida c = (Comida) a;
                if (c.getTipo().equals(Comida.TIPO_POSTRE)) {
                    escritor.println("Nombre: " + a.getNombre());
                    escritor.println("Precio: " + a.getPrecio());
                    escritor.println("___________________________");

                }
            }

        }
        escritor.close();
    }

    /**
     * genera un archivo con comidas de tipo plato fuerte
     *
     * @param archivo nombre del archivo
     * @throws FileNotFoundException
     */
    public void generarArchivoPlatoFuerte(File archivo) throws FileNotFoundException {
        PrintWriter escritor = new PrintWriter(archivo);
        ListIterator<Alimento> iterador = menu.listIterator();
        escritor.println("Platos Fuertes:");
        escritor.println("_______________________");
        while (iterador.hasNext()) {
            Alimento a = iterador.next();
            if (a instanceof Comida) {
                Comida c = (Comida) a;
                if (c.getTipo().equals(Comida.TIPO_PLATO_FUERTE)) {
                    escritor.println("Nombre: " + a.getNombre());
                    escritor.println("Precio: " + a.getPrecio());
                    escritor.println("___________________________");

                }
            }

        }
        escritor.close();
    }

    /**
     * genera un archivo de tipo bebida
     *
     * @param archivo
     * @throws FileNotFoundException
     */
    public void generarArchivoBebida(File archivo) throws FileNotFoundException {
        PrintWriter escritor = new PrintWriter(archivo);
        ListIterator<Alimento> iterador = menu.listIterator();
        escritor.println("Bebidas:");
        escritor.println("_______________________");
        while (iterador.hasNext()) {
            Alimento a = iterador.next();
            if (a instanceof Bebida) {
                escritor.println("Nombre: " + a.getNombre());
                escritor.println("Precio: " + a.getPrecio());
                escritor.println("___________________________");

            }

        }
        escritor.close();
    }

    public ArrayList<Alimento> anotarPedidoCliente(int m) {
        ArrayList<Alimento> detallesMesa = new ArrayList<Alimento>();
        for (int i = 0; i < clientes.length; i++) {
            if (clientes[i][m] != null) {
                ArrayList<Alimento> aux = clientes[i][m].revisarPedido();
                for (int j = 0; j < aux.size(); j++) {
                    if (detallesMesa.contains(aux.get(j))) {
                        for (int k = 0; k < detallesMesa.size(); k++) {
                            if (detallesMesa.get(k).getNombre().equals(aux.get(j).getNombre())) {
                                detallesMesa.get(k).setCantidad(detallesMesa.get(k).getCantidad() + aux.get(j).getCantidad());
                                System.out.println(detallesMesa.get(k).getNombre() + " " + detallesMesa.get(k).getCantidad());
                            }
                        }
                    } else {
                        detallesMesa.add(aux.get(j));
                    }
                }
            }
        }
        return detallesMesa;
    }

}
